package com.hangim.hangimsia.common.service.impl;

import com.hangim.hangimsia.common.domain.event.PreCreateEventEntity;
import com.hangim.hangimsia.common.domain.event.PreDeleteEventEntity;
import com.hangim.hangimsia.common.domain.event.PreUpdateEventEntity;
import com.hangim.hangimsia.common.service.BaseService;
import com.github.pig.common.util.DateUtils;
import com.github.pig.common.util.IdWorker;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.sql.Timestamp;
import java.util.Date;

/**
 * @see BaseService
 */
@Transactional
public abstract class BaseServiceImpl implements BaseService {
    @Autowired
    protected IdWorker idWorker;
    // ================================================================================================
    // 其他通用的方法
    // ================================================================================================

    /**
     * @see BaseService#generateNextId()
     */
    @Override
    public Long generateNextId() {
        return idWorker.nextId();
    }

    // ================================================================================================
    // 日期相关基础方法
    // ================================================================================================

    /**
     * @see BaseService#getTimestamp()
     */
    @Override
    public Timestamp getTimestamp() {
        return new Timestamp(new DateTime().getMillis());
    }

    /**
     * @see BaseService#getDatetime()
     */
    @Override
    public DateTime getDatetime() {
        return new DateTime();
    }

    /**
     * @see BaseService#getDate()
     */
    @Override
    public Date getDate() {
        return new DateTime().toDate();
    }

    /**
     * @see BaseService#getMaxDate()
     */
    @Override
    public Date getMaxDate() {
        return DateUtils.MAX_DATE;
    }

    /**
     * @see BaseService#getMinDate()
     */
    @Override
    public Date getMinDate() {
        return DateUtils.MIN_DATE;
    }

    /**
     * @see BaseService#getMaxTimestamp()
     */
    @Override
    public Timestamp getMaxTimestamp() {
        return DateUtils.MAX_TIMESTAMP;
    }

    /**
     * @see BaseService#getMinTimestamp()
     */
    @Override
    public Timestamp getMinTimestamp() {
        return DateUtils.MIN_TIMESTAMP;
    }

    // ================================================================================================
    // 实体相关预处理方法
    // ================================================================================================

    /**
     * 创建时间和创建入的预处理
     *
     * @param entity 实体
     */
    protected <E extends PreCreateEventEntity> void preCreate(E entity) {
        entity.setCreatedAt(getTimestamp());
    }

    /**
     * 更新时间和更新入的预处理
     *
     * @param entity 实体
     */
    protected <E extends PreUpdateEventEntity> void preUpdate(E entity) {
        entity.setUpdatedAt(getTimestamp());
    }

    /**
     * 删除时间和删除入的预处理
     *
     * @param entity 实体
     */
    protected <E extends PreDeleteEventEntity> void preDelete(E entity) {
        entity.setDeletedAt(getTimestamp());
    }

    // setter and getter
    public IdWorker getIdWorker() {
        return idWorker;
    }

    public void setIdWorker(IdWorker idWorker) {
        this.idWorker = idWorker;
    }

}
